﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using HomeCare.View;
using System.Data;
using System.Windows.Forms;


namespace HomeCare.Model {
    public class PessoaDados {
        Conexao con = new Conexao();

        public DataSet PesquisaPessoaPorLogin(String login, String senha) {
            SqlConnection sql = con.Conectar();
            sql.Open();
            string query = String.Empty;
            query += "select * ";
            query += "from Pessoas ";
            query += String.Format("where Pessoas.Login = '{0}' ", login);
            query += String.Format(" and Pessoas.Senha = '{0}' ", senha);
            try {
                SqlDataAdapter dataAdapter = new SqlDataAdapter(query, sql);
                DataSet dataSet = new DataSet();
                dataAdapter.Fill(dataSet);
                sql.Close();
                return dataSet;
            }
            catch (Exception ex) {
                sql.Close();
                throw new Exception("Erro ao Consultar a Pessoa.");
            }
        }

        public DataSet GetPacientes() {
            SqlConnection sql = con.Conectar();
            sql.Open();
            string query = String.Empty;
            query += "select * ";
            query += "from Pessoas ";
            query += "INNER JOIN Pessoas_has_Perfis ";
            query += "on Pessoas.ID = Pessoas_has_Perfis.Pessoas_ID ";
            query += "where Pessoas_has_Perfis.Perfis_ID = 0";
            //TODO Adicionar Join com Perfil para buscar os pacientes
            try {
                SqlDataAdapter dataAdapter = new SqlDataAdapter(query, sql);
                DataSet dataSet = new DataSet();
                dataAdapter.Fill(dataSet);
                sql.Close();
                return dataSet;
            }
            catch (Exception ex) {
                sql.Close();
                throw new Exception("Erro ao Consultar Pacientes.");
            }

        }

        public DataSet GetFuncionarios() {
            SqlConnection sql = con.Conectar();
            sql.Open();
            string query = String.Empty;
            query += "select * ";
            query += "from Pessoas ";
            query += "INNER JOIN Pessoas_has_Perfis ";
            query += "on Pessoas.ID = Pessoas_has_Perfis.Pessoas_ID ";
            query += "where Pessoas_has_Perfis.Perfis_ID = 2";
            //TODO Adicionar Join com Perfil para buscar os pacientes
            try {
                SqlDataAdapter dataAdapter = new SqlDataAdapter(query, sql);
                DataSet dataSet = new DataSet();
                dataAdapter.Fill(dataSet);
                sql.Close();
                return dataSet;
            }
            catch (Exception ex) {
                sql.Close();
                throw new Exception("Erro ao Consultar Funcionários.");
            }

        }


        public bool InserePessoa(Pessoa pessoa) {

            SqlConnection sql = con.Conectar();
            sql.Open();

            try {
                string dtNasc = pessoa.dtNasc.Year.ToString() + pessoa.dtNasc.Month.ToString() + pessoa.dtNasc.Day.ToString();
                string dtCad = pessoa.dtCad.Year.ToString() + pessoa.dtCad.Month.ToString() + pessoa.dtCad.Day.ToString();
                string query = String.Format("insert into Pessoas (Nome, Sexo, Profissao, DtNasc, DtCad, CPF, RG, Observacoes,Email, Login, Senha) values ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}'); SELECT CAST(scope_identity() AS int)", pessoa.nome, pessoa.sexo, pessoa.profissao, dtNasc, dtCad, pessoa.cpf, pessoa.rg, pessoa.observacoes, pessoa.email, pessoa.login, pessoa.senha);
                SqlCommand cmd = new SqlCommand(query, sql);
                Int32 pessoaID = (Int32)cmd.ExecuteScalar();
                cmd.Dispose();

                //Telefone Celular - grava dados na tabela Telefones caso esteja preenchido
                if (pessoa.telefoneCel.ddd != null || pessoa.telefoneCel.numero != null) {
                    string query2 = String.Format("insert into Telefones (Pessoas_ID, TipoTelefone, DDD, Numero) values ('{0}','{1}','{2}','{3}')", pessoaID, pessoa.telefoneCel.tipoTelefone, pessoa.telefoneCel.ddd, pessoa.telefoneCel.numero);
                    SqlCommand cmd2 = new SqlCommand(query2, sql);
                    cmd2.ExecuteNonQuery();
                    cmd2.Dispose();
                }

                //Telefone Comercial - grava dados na tabela Telefones caso esteja preenchido 
                if (pessoa.telefoneCom.ddd != null || pessoa.telefoneCom.numero != null) {
                    string query2 = String.Format("insert into Telefones (Pessoas_ID, TipoTelefone, DDD, Numero) values ('{0}','{1}','{2}','{3}')", pessoaID, pessoa.telefoneCom.tipoTelefone, pessoa.telefoneCom.ddd, pessoa.telefoneCom.numero);
                    SqlCommand cmd2 = new SqlCommand(query2, sql);
                    cmd2.ExecuteNonQuery();
                    cmd2.Dispose();
                }

                //Telefone Residencial - grava dados na tabela Telefones caso esteja preenchido 
                if (pessoa.telefoneRes.ddd != null || pessoa.telefoneRes.numero != null) {
                    string query2 = String.Format("insert into Telefones (Pessoas_ID, TipoTelefone, DDD, Numero) values ('{0}','{1}','{2}','{3}')", pessoaID, pessoa.telefoneRes.tipoTelefone, pessoa.telefoneRes.ddd, pessoa.telefoneRes.numero);
                    SqlCommand cmd2 = new SqlCommand(query2, sql);
                    cmd2.ExecuteNonQuery();
                    cmd2.Dispose();
                }

                //Endereco Residencial - grava dados na tabela Enderecos caso esteja preenchido 
                if (pessoa.enderecoRes.estados_ID != -1
                    && pessoa.enderecoRes.cidades_ID != -1
                    && pessoa.enderecoRes.bairro != String.Empty) {
                    string query2 = String.Format("insert into Enderecos (Pessoas_ID, TipoEndereco, Estados_ID, Cidades_ID, Bairro, Rua, Numero, Complemento) values ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}')", pessoaID, pessoa.enderecoRes.tipoEndereco, pessoa.enderecoRes.estados_ID, pessoa.enderecoRes.cidades_ID, pessoa.enderecoRes.bairro, pessoa.enderecoRes.rua, pessoa.enderecoRes.numero, pessoa.enderecoRes.complemento);
                    SqlCommand cmd2 = new SqlCommand(query2, sql);
                    cmd2.ExecuteNonQuery();
                    cmd2.Dispose();
                }

                sql.Close();
                return true;
            }
            catch (Exception ex) {

                sql.Close();
                MessageBox.Show(ex.Message);
                return false;
            }
        }


        public bool AlteraPessoa(Pessoa pessoa) {
            SqlConnection sql = con.Conectar();
            sql.Open();
            string query = String.Format("update Pessoas set Nome='{0}', Sexo='{1}' Profissao='{2}', DtNasc ='{3}', DtCad='{4}', CPF = '{5}' , Observacoes = '{6}', Email='{7}', Login = '{8}', Senha = '{9}' where id='{10}'", pessoa.nome, pessoa.sexo, pessoa.profissao, pessoa.dtNasc, pessoa.dtCad, pessoa.cpf, pessoa.rg, pessoa.observacoes, pessoa.email, pessoa.login, pessoa.senha, pessoa.id);

            try {
                SqlCommand cmd = new SqlCommand(query, sql);
                cmd.ExecuteNonQuery();
                cmd.Dispose();
                sql.Close();
                return true;
            }
            catch (Exception ex) {
                sql.Close();
                MessageBox.Show(ex.Message);
                return false;
            }
        }


        public bool ExcluiPessoa(Pessoa pessoa) {
            SqlConnection sql = con.Conectar();
            sql.Open();
            string query = String.Format("delete from Pessoas where Id='{0}'  delete from Telefones where Pessoas_Id='{0}' delete from Enderecos where Pessoas_Id='{0}'", pessoa.id);

            try {
                SqlCommand cmd = new SqlCommand(query, sql);
                cmd.ExecuteNonQuery();
                cmd.Dispose();
                sql.Close();
                return true;
            }
            catch (Exception ex) {
                sql.Close();
                MessageBox.Show(ex.Message);
                return false;
            }
        }

        public DataSet ConsultaPessoa(Pessoa pessoa) {
            SqlConnection sql = con.Conectar();
            sql.Open();
            string query = "select * from Pessoas where (1=1) ";
            query += String.IsNullOrEmpty(pessoa.nome) ? String.Empty : (String.Format(" and Nome like '%{0}%' ", pessoa.nome));

            query += " order by Nome ";
            try {
                SqlDataAdapter dataAdapter = new SqlDataAdapter(query, sql);
                DataSet dataSet = new DataSet();
                dataAdapter.Fill(dataSet);
                sql.Close();
                return dataSet;

            }
            catch (Exception ex) {
                sql.Close();
                throw new Exception("Erro ao Consultar Pessoa.");

            }
        }

        public DataSet GetRelatorioPacientes(Pessoa pessoa) {
            SqlConnection sql = con.Conectar();
            sql.Open();
            string query = String.Empty;
            query += "select Pessoas.Nome, Pessoas.Sexo, Pessoas.DtNasc as 'Data Nasc.', Enderecos.Rua, Enderecos.Bairro, Cidades.Cidade ";
            query += "from Pessoas ";
            query += "INNER JOIN Pessoas_has_Perfis on Pessoas.ID = Pessoas_has_Perfis.Pessoas_ID ";
            query += " INNER JOIN Enderecos on Pessoas.ID = Enderecos.Pessoas_ID";
            query += " inner join Cidades on Enderecos.Cidades_ID = Cidades.ID";
            query += " where Pessoas_has_Perfis.Perfis_ID = 6";
            if (!String.IsNullOrEmpty(pessoa.rg))
                query += " and Pessoas.RG = '" + pessoa.rg + "'";
            if (!String.IsNullOrEmpty(pessoa.nome))
                query += " and Pessoas.Nome like '%" + pessoa.nome + "%'";
            if (!String.IsNullOrEmpty(pessoa.sexo.ToString()))
                query += " and Pessoas.Sexo = '" + pessoa.sexo + "'";
            if (!String.IsNullOrEmpty(pessoa.cpf))
                query += " and Pessoas.CPF = '" + pessoa.cpf + "'";
            query += " ORDER BY Pessoas.Nome";
            //TODO Adicionar Join com Perfil para buscar os pacientes
            try {
                SqlDataAdapter dataAdapter = new SqlDataAdapter(query, sql);
                DataSet dataSet = new DataSet();
                dataAdapter.Fill(dataSet);
                sql.Close();
                return dataSet;
            }
            catch (Exception ex) {
                sql.Close();
                throw new Exception("Erro ao Consultar Pacientes.");
            }

        }

        public DataSet GetRelatorioMedico(Pessoa pessoa) {
            SqlConnection sql = con.Conectar();
            sql.Open();
            string query = String.Empty;
            query += "select Pessoas.Nome, Pessoas.Sexo, Pessoas.DtNasc as 'Data Nasc.', Enderecos.Rua, Enderecos.Bairro, Cidades.Cidade ";
            query += "from Pessoas ";
            query += "INNER JOIN Pessoas_has_Perfis on Pessoas.ID = Pessoas_has_Perfis.Pessoas_ID ";
            query += " INNER JOIN Enderecos on Pessoas.ID = Enderecos.Pessoas_ID";
            query += " inner join Cidades on Enderecos.Cidades_ID = Cidades.ID";
            query += " where Pessoas_has_Perfis.Perfis_ID = 3";
            if (!String.IsNullOrEmpty(pessoa.rg))
                query += " and Pessoas.RG = '" + pessoa.rg + "'";
            if (!String.IsNullOrEmpty(pessoa.nome))
                query += " and Pessoas.Nome like '%" + pessoa.nome + "%'";
            if (!String.IsNullOrEmpty(pessoa.sexo.ToString()))
                query += " and Pessoas.Sexo = '" + pessoa.sexo + "'";
            if (!String.IsNullOrEmpty(pessoa.cpf))
                query += " and Pessoas.CPF = '" + pessoa.cpf + "'";
            query += " ORDER BY Pessoas.Nome";

            try {
                SqlDataAdapter dataAdapter = new SqlDataAdapter(query, sql);
                DataSet dataSet = new DataSet();
                dataAdapter.Fill(dataSet);
                sql.Close();
                return dataSet;
            }
            catch (Exception ex) {
                sql.Close();
                throw new Exception("Erro ao Consultar Médicos.");
            }

        }

        public DataSet GetRelatorioUsuarios(Pessoa pessoa) {
            SqlConnection sql = con.Conectar();
            sql.Open();
            string query = String.Empty;
            query += "select Pessoas.Nome, Pessoas.Login ";
            query += "from Pessoas ";
            query += "where Pessoas.Login is not null";
            if (!String.IsNullOrEmpty(pessoa.login))
                query += " and Pessoas.Login like '%" + pessoa.login + "%'";
            query += " ORDER BY Pessoas.Nome";
            //TODO Adicionar Join com Perfil para buscar os pacientes
            try {
                SqlDataAdapter dataAdapter = new SqlDataAdapter(query, sql);
                DataSet dataSet = new DataSet();
                dataAdapter.Fill(dataSet);
                sql.Close();
                return dataSet;
            }
            catch (Exception ex) {
                sql.Close();
                throw new Exception("Erro ao Consultar Pacientes.");
            }

        }


    }
}
